# Полезные практики от опытных разработчиков

## Переопределение checkWorkAbility()

В `checkWorkAbility` нельзя использовать:
- `thisRop()`, заместо этого лучше использовать `getVar/getSelfVar`
- обходчики, особенно с инвалидацией в БД (запросом на согласование данных в БД) (например, `refreshByParent()` ).

Нужно понимать, что `checkWorkAbility` вызывается часто, поэтому его оптимизация сильно сказывается на времени работы бизнес-логики.


## session.flush() заместо session.commit()

`session.commit()` лучше избегать и использовать `session.flush()`.

`commit()` выгружает данные из кэша в БД.

`flush()` применяет изменения сессии к БД.

В случае использования `flush()` данные ещё не в БД и есть возможность откатить изменения, например, в случае ошибки.

`commit()` вызывает `afterEdit()` с проверкой обязательных полей в отличии от `flush()`.

## Избегать использование [Option].get и [Collection].head
 
Не использовать для:
- Option `.get`, если внутри был `None`, то выпадет исключение.

    Использовать `.getOrElse(<значение или исключение, в случае None>)`.

- коллекций .head без проверки на пустоту коллекции.

    лучше использовать `.headOption`, что вернёт результат в конструкции `Option`, который дальше распаковать через `.getOrElse()`.

## РњРёРєСЃРёРЅ Btk_Object

миксин Btk_Object хранит все записи классов супер-типа документ и справочник.

В него нельзя вносить изменения! Это системный миксин.